(function(){
    // Ext.data.reader.Reader：将proxy读取的数据按照不同的规则解析并保存到Model中
    // 包含2个子类：Ext.data.reader.Json和Ext.data.reader.XML
    
    // Ext.data.reader.Json: json读取器，子类Ext.data.reader.Array
    // 数据形式 userData
    function testExtDataReaderJson(){
        // 定义模型类
        Ext.define("User", {
            extend: "Ext.data.Model",
            fields: [
                {name: "userId", type: "int"},
                {name: "name", type: "string"}
            ],
            // Ext.data.HasManyAssociation 配置一对多
            hasMany: {
                model: "Order"
                // name: "Order" // 与模型名相同就省略
            }
        });
        Ext.define("Order", {
            extend: "Ext.data.Model",
            fields: [
                {name: "id", type: "int"},
                {name: "name", type: "string"}
            ],
            // Ext.data.BelongsToAssociation 配置多对一
            belongsTo: {
                model: "User"
            }
        });
        // 要求数据，对应类似一个分页bean形式
        // user对应的是一个model数组
        var userData = {
            // total: 200, // 默认的名称，可修改成其他，reader的totalProperty来指定
            count: 200, 
            user: [{
                auditor: "",
                info: {
                    userId: 1,
                    name: "u1",
                    orders: [
                        {id: 1, name: "pen"},
                        {id: 2, name: "banana"}
                    ]
                }
            }]
        };
        // 内存代理
        var mproxy = Ext.create("Ext.data.proxy.Memory", {
            model: "User",
            data: userData,
            // 配置读写器才能读取复杂的数据
            reader: {
                // 指定解析格式
                type: "json",
                // 指定是否级联读取
                implicitIncludes: true,
                // 指定total属性名，默认是total
                totalProperty: "count",
                // root是必须的，指定store位置
                root: "user",
                // record筛选有效数据来对应指定的model，不筛选可以省略不写
                record: "info",
                // 指定读取成功的属性名，默认是success
                successProperty: "success"
                // idProperty 
            }
        });
        // 读取数据
        mproxy.read(new Ext.data.Operation(), function(result){
            var resultSet = result.resultSet;
            // resultSet.total 记录总条数，固定就是total这个名称
            alert(resultSet.total); 
            var models = resultSet.records;
            Ext.Array.each(models, function(model){
                // 取的是User的名称
                alert(model.get("name"));
            });
            var user = models[0];
            // 取一对多，取出的model的集合store
            var orders = user.orders();
            orders.each(function(order){
                // 取的是其中一个对应的Order的名称
                alert(order.get("name"));
            });
        });
    }
    
    // Ext.data.reader.Array
    // 返回数据形式 [[1, 'u1']]
    function testExtDataReaderArray(){
         Ext.define("User", {
            extend: "Ext.data.Model",
            fields: [
                {name: "userId", type: "int"},
                {name: "name", type: "string"}
            ],
            proxy: {
                type: "ajax",
                url: webroot + "/lesson05/datareaderarray",
                reader: {
                    // 字段顺序对应
                    type: "array"
                }
            }
        });
        var user = Ext.ModelManager.getModel("User");
        user.load(1, {
            success: function(model){
                alert(model.get("name"));
            }
        });
    }
    
    // Ext.data.reader.XML
    // 返回数据形式 <users><user><id>1</id><name>u1</name></user></users>
    function testExtDataReaderXml(){
        Ext.define("User", {
            extend: "Ext.data.Model",
            fields: [
                // 也只支持数组形式，省略其他配置参数
                // "userId", "name"
                {name: "userId", type: "int"},
                {name: "name", type: "string"}
            ],
            proxy: {
                // 省略model
                type: "ajax",
                url: webroot + "/lesson05/datareaderxml",
                reader: {
                    type: "xml",
                    record: "user"
                }
            }
        });
        var user = Ext.ModelManager.getModel("User");
        // load的时候触发
        user.load(1, {
            success: function(model){
                alert(model.get("name"));
            }
        });
    }
    
    // Ext.data.writer.Writer：解析成特定格式传到后台
    // 包含2个子类：Ext.data.writer.Json和Ext.data.writer.Xml
    
    // Ext.data.writer.Json
    function testExtDataWriterJson(){
         Ext.define("User", {
            extend: "Ext.data.Model",
            fields: [
                {name: "userId", type: "int"},
                {name: "name", type: "string"}
            ],
            proxy: {
                type: "ajax",
                url: webroot + "/lesson05/jsonRequest",
                writer: {
                    // Content-Type:application/json
                    type: "json"
                }
            }
        });
        var user = Ext.create("User", {
            userId: 2,
            name: "u2"
        });
        // save的时候触发
        // 输出内容：{userId: 2, name: "u2"}
        user.save();
    }
    
    // Ext.data.writer.Xml
    function testExtDataWriterXml(){
        Ext.define("User", {
            extend: "Ext.data.Model",
            fields: [
                {name: "userId", type: "int"},
                {name: "name", type: "string"}
            ],
            proxy: {
                type: "ajax",
                url: webroot + "/lesson05/xmlRequest",
                writer: {
                    // Content-Type:text/xml
                    type: "xml"
                }
            }
        });
        var user = Ext.create("User", {
            userId: 3,
            name: "u3"
        });
        // save的时候触发
        // 输出内容：<xmlData><record><userId>3</userId><name>u3</name></record></xmlData>
        user.save();
    }
    
    var webroot;
    
    Ext.onReady(function(){
        webroot = Ext.get("webroot").getValue();
//        testExtDataReaderJson();
//        testExtDataReaderArray();
//        testExtDataReaderXml();
        testExtDataWriterJson();
//        testExtDataWriterXml();
    });
})();